package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.config.MinioClientConfig;
import com.atguigu.tingshu.album.config.MinioConstantProperties;
import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.javassist.expr.NewArray;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.awt.desktop.AboutHandler;
import java.util.List;

/***
 * 专辑管理接口
 */
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)//事务最高
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {
    //TODO 用户Id
    private final Long userId = 1L;

    @Autowired
    private AlbumInfoMapper albumInfoMapper;
    @Resource
    AlbumAttributeValueMapper albumAttributeValueMapper;
    @Resource
    AlbumStatMapper albumStatMapper;
    @Resource
    MinioClientConfig minioClientConfig;


    /**
     * 上传专辑
     *
     * @param albumInfoVo
     */
    @Override
    public void saveAlbumInfo(AlbumInfoVo albumInfoVo) {
        //参数校验已经在实体类中用标签校验
        //将vo转do
        AlbumInfo albumInfo = new AlbumInfo();
        //属性转移
        BeanUtils.copyProperties(albumInfoVo, albumInfo);
        //TODO 登录后完成优化
        albumInfo.setUserId(1L);//用户登录id
        albumInfo.setStatus("0301");//审核通过
        albumInfo.setTracksForFree(5);//免费试听集数
        //保存专辑数据 adum_info
        if (!save(albumInfo)) {
            throw new GuiguException(201, "新增专辑失败");
        }
        //获取专辑id
        Long id = albumInfo.getId();
        //新增专辑的标签数据
        albumInfoVo.getAlbumAttributeValueVoList().stream().forEach(albumAttributeValueVo -> {
            //vo转do
            AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
            BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
            //补全id
            albumAttributeValue.setAlbumId(id);
            //新增
            if (albumAttributeValueMapper.insert(albumAttributeValue) <= 0) {
                throw new GuiguException(201, "新增专辑标签失败");
            }
        });
        //初始化专辑的统计表
        initAumStat(id);

    }

    /**
     * 分页
     *
     * @param page
     * @param size
     * @return
     */
    @Override
    public Object findUserAlbumPage(int page, int size, AlbumInfoQuery albumInfoQuery) {
        return albumInfoMapper.findUserAlbumPage(new Page<AlbumListVo>(page, size), albumInfoQuery);
    }

    /**
     * 删除
     *
     * @param albumId
     */
//    @Override
//    public void removeAlbumInfo(Long albumId) {
//        //删除专辑表的数据--错误!!!!
////		if(!removeById(albumId)){
////			throw new GuiguException(201, "删除专辑失败");
////		}
//        //删除专辑
//        if (!remove(new LambdaQueryWrapper<AlbumInfo>()
//                .eq(AlbumInfo::getId, albumId)
//                .eq(AlbumInfo::getUserId, userId))) {
//            throw new GuiguException(201, "删除专辑失败");
//        }
//        //删除专辑标签表的数据
//        int flag = albumAttributeValueMapper.delete(
//                new LambdaQueryWrapper<AlbumAttributeValue>()
//                        .eq(AlbumAttributeValue::getAlbumId, albumId));
//        if (flag < 0) {
//            throw new GuiguException(201, "删除专辑失败");
//        }
//        //删除专辑统计表的数据
//        flag = albumStatMapper.delete(
//                new LambdaQueryWrapper<AlbumStat>()
//                        .eq(AlbumStat::getAlbumId, albumId));
//        if (flag < 0) {
//            throw new GuiguException(201, "删除专辑失败");
//        }
//
//
//    }

    /**
     * 删除错误
     * @param albumId
     * @return
     */
    @Override
    public void removeAlbumInfo(Long albumId) {
    //删除专辑表
        if(!remove(new LambdaQueryWrapper<AlbumInfo>()
                .eq(AlbumInfo::getId, albumId)
                .eq(AlbumInfo::getUserId, userId))){
            throw new GuiguException(201, "删除专辑失败");
        }
       remove(new LambdaQueryWrapper<AlbumInfo>()
                .eq(AlbumInfo::getId, albumId)
                .eq(AlbumInfo::getUserId, userId));
        //删除标签表
        int flag = albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
        if(flag<0){
            throw new GuiguException(201, "删除专辑标签失败");
        }
        //删除统计表
        flag = albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId, albumId));
        if(flag<0){
            throw new GuiguException(201, "删除专辑统计失败");
        }
    }

    /**
     * 数据回显
     *
     * @param albumId
     * @return
     */
    @Override
    public Object getAlbumInfo(Long albumId) {
        //专辑表
        AlbumInfo albumInfo = getById(albumId);
        //判断
        if (albumInfo == null) {
            throw new GuiguException(201, "专辑不存在");
        }
        //专辑标签表
        List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>()
                .eq(AlbumAttributeValue::getAlbumId, albumId));

        //保存
        albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
        //返回
        return albumInfo;
    }

    /**
     * 修改
     * @param albumId
     * @param albumInfoVo
     */
    @Override
    public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
        //查询专辑数据
        AlbumInfo albumInfo = getOne(new LambdaQueryWrapper<AlbumInfo>().eq(AlbumInfo::getId, albumId)
                .eq(AlbumInfo::getUserId, userId));
        if (albumInfo == null) {
            return;
        }
        //属性转移
        BeanUtils.copyProperties(albumInfoVo, albumInfo);
        //修改专辑表
        if(!updateById(albumInfo)){
            throw new GuiguException(201, "修改专辑标签失败");
        }
        //删除专辑标签表
        int flag=albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>()
                .eq(AlbumAttributeValue::getAlbumId, albumId));
        if (flag <0) {
            throw new GuiguException(201, "修改标签表失败");
        }
        //新增标签数据
        albumInfoVo.getAlbumAttributeValueVoList().stream().forEach(albumAttributeValueVo -> {
            //vo转do
            AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
            BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
            //补全专辑id
            albumAttributeValue.setAlbumId(albumId);
            //新增
            if (albumAttributeValueMapper.insert(albumAttributeValue)<=0){
                throw new GuiguException(201, "标签新增失败");
            }
        });
    }

    /**
     * 查询专辑
     * @return
     */
    @Override
    public Object findUserAllAlbumList() {
        //分页查询作者对应的专辑
        return page(new Page<>(1,10),new LambdaQueryWrapper<AlbumInfo>()
                .eq(AlbumInfo::getUserId, userId)
                .eq(AlbumInfo::getStatus, "0301")).getRecords();
    }

    private void initAumStat(Long id) {
        //初始化
        AlbumStat albumStat = new AlbumStat();
        albumStat.setAlbumId(id);
        //统计类型：0401-播放量
        albumStat.setStatType(SystemConstant.ALBUM_STAT_PLAY);
        albumStatMapper.insert(albumStat);
        // 0402-订阅量
        albumStat.setId(null);
        albumStat.setStatType(SystemConstant.ALBUM_STAT_SUBSCRIBE);
        albumStatMapper.insert(albumStat);
        // 0403-购买量
        albumStat.setId(null);
        albumStat.setStatType(SystemConstant.ALBUM_STAT_BROWSE);
        albumStatMapper.insert(albumStat);
        // 0404-评论数
        albumStat.setId(null);
        albumStat.setStatType(SystemConstant.ALBUM_STAT_COMMENT);
        albumStatMapper.insert(albumStat);
    }
}
